Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Shellcode</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Shellcode"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Shellcode rootpage-Shellcode skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Shellcode</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr"><p>Un <b>shellcode</b> est une <a href="Cha%C3%AEne_de_caract%C3%A8res" title="Chaîne de caractères">chaîne de caractères</a> qui représente un code binaire exécutable. À l'origine destiné à lancer un <a href="Shell_(informatique)" class="mw-redirect" title="Shell (informatique)">shell</a> ('/bin/sh' sous <a href="Unix" title="Unix">Unix</a> ou <a href="Command.com" class="mw-redirect" title="Command.com">command.com</a> sous <a href="DOS" title="DOS">DOS</a> et <a href="Microsoft_Windows" title="Microsoft Windows">Microsoft Windows</a> par exemple), le mot a évolué pour désigner tout code malveillant qui détourne un programme de son exécution normale. Un shellcode peut être utilisé par un <a href="Hacker_(s%C3%A9curit%C3%A9_informatique)" title="Hacker (sécurité informatique)">hacker</a> voulant avoir accès à une <a href="Interface_en_ligne_de_commande" title="Interface en ligne de commande">interface en ligne de commande</a>.
</p><p>Historiquement, les shellcodes ont été développés dans le cadre de la recherche en sécurité informatique pour démontrer les vulnérabilités des systèmes. Par exemple, ils ont été utilisés dans des attaques célèbres telles que le ver <a href="Morris_(ver_informatique)" title="Morris (ver informatique)">Morris en 1988.</a>
</p>

<div class="mw-heading mw-heading2"><h2 id="Fonctionnement_d'un_shellcode"><span id="Fonctionnement_d.27un_shellcode"></span>Fonctionnement d'un shellcode</h2></div>
<p>Pour mieux comprendre le fonctionnement des shellcodes, il est utile de connaître les bases de l'architecture des systèmes informatiques, notamment la <a href="Gestion_de_la_m%C3%A9moire" title="Gestion de la mémoire">gestion de la mémoire</a> et le <a rel="nofollow" class="external text" href="https://www.journaldunet.fr/web-tech/dictionnaire-du-webmastering/1445278-buffer-definition-et-fonctionnement-pratique/#:~:text=Qu'est%2Dce%20que%20le,sein%20d'un%20ordinateur%20moderne">fonctionnement des buffers</a>.
</p><p>Généralement, les shellcodes sont injectés dans la mémoire de l'ordinateur grâce à l'exploitation d'un <a href="D%C3%A9passement_de_tampon" title="Dépassement de tampon">dépassement de tampon</a>. Dans ce cas, l'exécution du shellcode peut être déclenchée par le remplacement dans la <a href="Pile_(informatique)" title="Pile (informatique)">pile</a> (<i>stack</i> en anglais) de l'adresse normale de retour par l'adresse du shellcode injecté. Ainsi, lorsque la routine est terminée, le <a href="Microprocesseur" title="Microprocesseur">microprocesseur</a>, qui doit normalement exécuter les instructions situées à l'adresse de retour, exécute le shellcode.
</p>
<div class="mw-heading mw-heading2"><h2 id="Écriture_de_shellcodes"><span id=".C3.89criture_de_shellcodes"></span>Écriture de shellcodes</h2></div>
<p>L'écriture de shellcodes est soumise à des contraintes. En effet, un shellcode est une chaîne de caractères qui va être injectée en <a href="M%C3%A9moire_informatique" class="mw-redirect" title="Mémoire informatique">mémoire</a> car elle sera en dehors de l'espace normalement alloué. Or les chaînes de caractères, dans la plupart des <a href="Langage_de_programmation" title="Langage de programmation">langages de programmation</a>, ont l'octet nul (0x00) comme marqueur de fin. Par exemple la fonction strcpy<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> en <a href="C_(langage)" title="C (langage)">C</a> arrête la copie de chaîne dès qu'elle rencontre cet octet. Un shellcode ne peut donc pas contenir d'<a href="Octet" title="Octet">octet</a> 0x00, sinon, il ne sera pas entièrement copié.
</p><p>L'écriture d'un shellcode demande alors de n'avoir recours à aucune instruction <a href="Assembleur" title="Assembleur">assembleur</a> contenant un octet nul (à l'exception du dernier). La tâche étant ardue, les concepteurs de shellcodes importants écrivent initialement un «&nbsp;chargeur&nbsp;» de shellcode servant à transformer un code assembleur (pouvant contenir des octets nuls) en un code ne contenant pas d'octet nul (le code du chargeur devant à son tour être écrit sans <a href="Caract%C3%A8re_nul" title="Caractère nul">caractère nul</a>). Une technique classique consiste à transformer chaque octet du code par une opération «&nbsp;ou exclusif&nbsp;» (<a href="XOR" class="mw-redirect" title="XOR">XOR</a>)&nbsp;: cette opération est simple, réversible, et on peut généralement (quoique pas à coup sûr) trouver une «&nbsp;clé&nbsp;» à appliquer au «&nbsp;ou exclusif&nbsp;» permettant d'éviter les caractères nuls.
</p><p>Dans certains contextes, les contraintes sont encore plus sévères&nbsp;: le jeu d'octets autorisés peut être encore plus réduit. Il est possible que la chaîne envoyée au programme vulnérable ait précédemment été filtrée pour ne faire passer que des caractères <a href="Alphanum%C3%A9rique" class="mw-redirect" title="Alphanumérique">alphanumériques</a> (ayant un code ASCII compris entre 32 et 127 par exemple). On trouve un autre exemple classique sur certains systèmes fonctionnant en interne en <a href="UTF-16" title="UTF-16">UTF-16</a> (cf <a href="Unicode" title="Unicode">Unicode</a>)&nbsp;: il arrive qu'une chaîne de caractères codée sur 8 bits soit d'abord «&nbsp;étendue&nbsp;» en UTF-16 (en ajoutant un 0 un octet sur deux généralement) puis traitée. Dans ce cas, les instructions qui pourront être exécutées par l'attaquant seront forcément de la forme <b>XX00</b> (en <a href="Hexad%C3%A9cimal" class="mw-redirect" title="Hexadécimal">hexadécimal</a>), ce qui complique énormément la tâche du concepteur de shellcode.
</p><p>Dans ces deux cas, la technique est la même que précédemment&nbsp;: écrire un «&nbsp;décodeur&nbsp;» avec ces contraintes qui transforme (en mémoire) le véritable code malveillant encodé précédemment. L'écriture du cœur du code malveillant (on parle de <i>payload</i>) est alors plus facile et indépendante du type de contraintes de la cible. Ainsi, il existe actuellement de véritables <a href="Biblioth%C3%A8que_logicielle" title="Bibliothèque logicielle">bibliothèques</a> de construction de shellcodes permettant de l'assembler par type de fonction à réaliser et par contraintes (par "codeur" à intégrer).
</p>
<div class="mw-heading mw-heading2"><h2 id="Détection_de_shellcodes"><span id="D.C3.A9tection_de_shellcodes"></span>Détection de shellcodes</h2></div>
<p>L'exploitant agissant généralement avec une certaine marge d'erreur lors de l'exploitation d'une faille dans la découverte de la bonne <a href="Adressage_m%C3%A9moire" title="Adressage mémoire">adresse mémoire</a> (voir <a href="D%C3%A9passement_de_tampon" title="Dépassement de tampon">Dépassement de tampon</a>), le shellcode est préfixé d'un maximum d'instructions nulpotentes (<a href="Langage_machine" title="Langage machine">opcode</a> <a href="NOP" title="NOP">NOP</a>, codé 0x90 sur architecture 80x86) pour optimiser les chances d'exécution du shellcode. Ainsi, la première méthode de détection de shellcodes a été de repérer les séries de <i>NOP</i> en mémoire pour empêcher d'exécuter le shellcode qui suit les <i>NOP</i>. Cette méthode est cependant relativement coûteuse en temps de calcul.
</p><p>D'autres méthodes se basent sur le fait qu'un shellcode contient souvent certaines chaînes de caractères spécifiques servant à ouvrir un shell comme <i>/bin/sh</i>. Un programme faisant référence à cette chaîne de caractères est donc suspect et il est alors possible d'empêcher son exécution.
</p><p>Cependant, les hackers peuvent outrepasser ces méthodes basiques de détection en chiffrant cette chaîne de caractères, ou même en utilisant du code polymorphe<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>.
</p><p>Un autre moyen de détection est de regarder si le programme essaye d'accéder à une zone mémoire qui n'est pas attribuée au programme en cours.
</p><p>Néanmoins, les techniques de prévention modernes incluent l'utilisation de solutions de sécurité avancées comme l'<a href="ASLR" class="mw-redirect" title="ASLR">ASLR</a> (Address Space Layout Randomization) et les <a href="Data_Execution_Prevention" title="Data Execution Prevention">DEP</a> (Data Execution Prevention), qui compliquent l'exécution de shellcodes.
</p>
<div class="mw-heading mw-heading2"><h2 id="Exemple_de_shellcode">Exemple de shellcode</h2></div>
<p>Exemple de shellcode, largement publié (voir liens externes), d'une cinquantaine d'octets permettant d'exécuter (via un appel à l'interruption 0x80) le programme <i>/bin/sh</i>. Ce shellcode est programmé avec des instructions ne contenant aucun caractère nul. Il ne fonctionne que sur architecture <a href="X86" title="X86">80x86</a>, sous <a href="Linux" title="Linux">Linux</a>.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">char</span><span class="w"> </span><span class="n">shellcode</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="s">"</span><span class="se">\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff</span><span class="s">/bin/sh"</span><span class="p">;</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Notes_et_références"><span id="Notes_et_r.C3.A9f.C3.A9rences"></span>Notes et références</h2></div>
<div class="references-small decimal" style=""><div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcpy.html"><cite style="font-style:normal;">Strcpy</cite></a>&nbsp;», sur <span class="italique">opengroup.org</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2023-11-19" data-sort-value="2023-11-19">19 novembre 2023</time>)</small></span>.</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a> </span><span class="reference-text">voir <a href="Code_imp%C3%A9n%C3%A9trable" title="Code impénétrable">Code impénétrable</a> et <a href="Virus_polymorphe" title="Virus polymorphe">Virus polymorphe</a></span>
</li>
</ol></div>
</div>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<ul><li><a href="D%C3%A9passement_de_tampon" title="Dépassement de tampon">Dépassement de tampon</a></li>
<li><a href="Vuln%C3%A9rabilit%C3%A9_(informatique)" title="Vulnérabilité (informatique)">Vulnérabilité (informatique)</a></li>
<li><a href="Reverse_shell" title="Reverse shell">Reverse shell</a></li></ul>
<p><br>
</p>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la sécurité des systèmes d'information</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2025-10-03" href="https://fr.wikipedia.org/wiki/?title=Shellcode&amp;oldid=229471992">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>